}
if (!is_substructure)
{
- surface->x = event->configure.x;
- surface->y = event->configure.y;
+ if (surface->x != event->configure.x ||
+ surface->y != event->configure.y)
+ {
+ surface->x = event->configure.x;
+ surface->y = event->configure.y;
+ }
if (surface_impl->unscaled_width != xevent->xconfigure.width ||
surface_impl->unscaled_height != xevent->xconfigure.height)
if (surface->resize_count == 0)
_gdk_x11_moveresize_configure_done (display, surface);
}
+
+ gdk_x11_surface_update_popups (surface);
}
}
break;
static void
gdk_x11_surface_finalize (GObject *object)
{
+ GdkSurface *surface;
GdkX11Surface *impl;
g_return_if_fail (GDK_IS_X11_SURFACE (object));
+ surface = GDK_SURFACE (object);
impl = GDK_X11_SURFACE (object);
+ if (surface->parent)
+ {
+ GdkX11Surface *parent_impl = GDK_X11_SURFACE (surface->parent);
+ parent_impl->popups = g_list_remove (parent_impl->popups, surface);
+ }
+
if (impl->toplevel->in_frame)
unhook_surface_changed (GDK_SURFACE (impl));
xattributes.colormap = gdk_x11_display_get_window_colormap (display_x11);
xattributes_mask |= CWColormap;
- if (surface->surface_type == GDK_SURFACE_TEMP)
+ if (surface->surface_type == GDK_SURFACE_TEMP ||
+ surface->surface_type == GDK_SURFACE_POPUP)
{
xattributes.save_under = True;
xattributes.override_redirect = True;
gdk_surface_freeze_toplevel_updates (surface);
+ if (parent)
+ {
+ GdkX11Surface *parent_impl = GDK_X11_SURFACE (parent);
+ parent_impl->popups = g_list_prepend (parent_impl->popups, surface);
+ }
+
return surface;
}
static inline void
x11_surface_move (GdkSurface *surface,
- gint x,
- gint y)
+ gint x,
+ gint y)
{
GdkX11Surface *impl = GDK_X11_SURFACE (surface);
{
surface->x = x;
surface->y = y;
+
+ if (surface->parent)
+ {
+ impl->offset_x = surface->x - surface->parent->x;
+ impl->offset_y = surface->y - surface->parent->y;
+ }
}
}
static inline void
x11_surface_move_resize (GdkSurface *surface,
- gint x,
- gint y,
- gint width,
- gint height)
+ gint x,
+ gint y,
+ gint width,
+ gint height)
{
GdkX11Surface *impl = GDK_X11_SURFACE (surface);
surface->height = height;
_gdk_x11_surface_update_size (GDK_X11_SURFACE (surface));
+
+ if (surface->parent)
+ {
+ impl->offset_x = surface->x - surface->parent->x;
+ impl->offset_y = surface->y - surface->parent->y;
+ }
}
else
{
static void
gdk_x11_surface_move_resize (GdkSurface *surface,
- gboolean with_move,
- gint x,
- gint y,
- gint width,
- gint height)
+ gboolean with_move,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
{
if (with_move && (width < 0 && height < 0))
x11_surface_move (surface, x, y);
}
}
+static void gdk_x11_surface_restack_toplevel (GdkSurface *surface,
+ GdkSurface *sibling,
+ gboolean above);
+
+void
+gdk_x11_surface_update_popups (GdkSurface *parent)
+{
+ GdkX11Surface *impl = GDK_X11_SURFACE (parent);
+ GList *l;
+
+ for (l = impl->popups; l; l = l->next)
+ {
+ GdkX11Surface *popup_impl = l->data;
+ GdkSurface *popup = GDK_SURFACE (popup_impl);
+ int new_x = parent->x + popup_impl->offset_x;
+ int new_y = parent->y + popup_impl->offset_y;
+
+ if (new_x != popup->x || new_y != popup->y)
+ x11_surface_move (popup, new_x, new_y);
+ gdk_x11_surface_restack_toplevel (popup, parent, TRUE);
+ }
+}
+
void
_gdk_x11_surface_set_surface_scale (GdkSurface *surface,
int scale)
static void
gdk_x11_surface_restack_toplevel (GdkSurface *surface,
- GdkSurface *sibling,
- gboolean above)
+ GdkSurface *sibling,
+ gboolean above)
{
XWindowChanges changes;